﻿Imports System.Text.RegularExpressions

Public Enum EnumBarcodeType
    GROUP_REPORT_CODE
    REPORT_CODE
    SEND_CODE
    CANCEL_CODE
    KEY_CANCEL
    KEY_SEND
    SYSITEM_CD
    INBOX_QTY
    UNIQUE_CD
    KEY_INPUT

    NONE
    RESET_CODE
    IRREGULAR_CODE
    SHIPORDER_CODE
    ORDER_CODE
    INNER_LABEL_CODE
    OUTER_LABEL_CODE_I
    OUTER_LABEL_CODE_D
    OUTER_LABEL_CODE_M
    END_LABEL_CODE
    ME_CLOSED_CODE
    EMP_CODE
    INNER_DELIVERY

End Enum

Public Class CBarcode

    Public Shared ReadOnly Property RESETCODE() As String
        Get
            Return CConst.CNS_RESET1
        End Get
    End Property

    Public Shared Function GetBarcodeType(ByVal barcode As String) As EnumBarcodeType
        Dim checkText As String = barcode
        'MessageBox.Show("checkText:" & checkText)
        '***************************
        '* 未出荷総統括レポートコードチェック ""##"" 
        '***************************
        If checkText.EndsWith(CConst.CNS_BARCD_SHIPGROUP) Then
            If checkText.StartsWith(CConst.CNS_BARCD_SHIPGROUP) Then
                Return EnumBarcodeType.GROUP_REPORT_CODE
                'Return EnumBarcodeType.REPORT_CODE
            End If
        End If

        ''***************************
        ''* ラベル読取終了コードチェック
        ''***************************
        Select Case checkText
            Case CConst.CNS_END_LABEL
                Return EnumBarcodeType.END_LABEL_CODE
            Case CConst.CNS_KEYSEND
                Return EnumBarcodeType.SEND_CODE
            Case CConst.CNS_KEYDELETE
                Return EnumBarcodeType.KEY_CANCEL
        End Select

        '***************************
        '* 未出荷統括レポートコードチェック "UN"
        '***************************
        If checkText.StartsWith(CConst.CNS_UNSHIPREPORT) Then
            Return EnumBarcodeType.REPORT_CODE
        End If

        '***************************
        '* 出荷統括レポートコードチェック "SH"
        '***************************
        If checkText.StartsWith(CConst.CNS_SHIPREPORT) Then
            Return EnumBarcodeType.REPORT_CODE
        End If


        '***************************
        '* 注文番号チェック "ODR" -->バーコード
        '***************************
        If checkText.StartsWith(CConst.CNS_ORDERCD_HEAD) Then
            Return EnumBarcodeType.ORDER_CODE
        End If

        '***************************
        '* 画面からの入力チェック "[" "]"
        '***************************
        If checkText.StartsWith(CConst.CNS_KEY_HEAD) Then
            If checkText.EndsWith(CConst.CNS_KEY_END) Then
                Return EnumBarcodeType.KEY_INPUT
                'Return EnumBarcodeType.REPORT_CODE
            End If
        End If


        '***************************
        '* 注文番号チェック "DEL"
        '***************************
        If checkText.StartsWith(CConst.CNS_CANCELCD_HEAD) Then
            Return EnumBarcodeType.CANCEL_CODE
        End If

        '***************************
        '* 途中送信 "SEND_DATA"
        '***************************
        If checkText.StartsWith(CConst.CNS_SENDCD) Then
            Return EnumBarcodeType.SEND_CODE
        End If

        '***************************
        '* 社内ラベルチェック
        '***************************
        'NNNNNNNNNNNN@UUUUXX
        'NNNNNNNNNNNN@UUUU**
        If checkText.Length > 7 Then
            If checkText.IndexOf(CConst.CNS_DELIMITER_LABEL_INNER) = checkText.Length - 7 Then
                If Regex.IsMatch(CCommon.TrimCode(checkText, CConst.CNS_DELIMITER_LABEL_INNER, EnumBarcodeType.INNER_LABEL_CODE), "[0-9A-Z]{4}") Then
                    Return EnumBarcodeType.INNER_LABEL_CODE
                End If
            End If
        End If


        ''***************************
        ''* 従業員コードチェック "DEL"
        ''***************************
        Dim checkInfo As CCheck = CCheck.GetIns
        Dim EmpData As CCheck.EmpData = checkInfo.ChkEmpData(checkText)

        If Not EmpData.empCd Is Nothing Then
            Return EnumBarcodeType.EMP_CODE
        End If

        ''If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_FRACTION) Then
        ''    checkText = checkText.Substring(0, checkText.Length - 1)
        ''End If

        ''***************************
        ''* リセットコードチェック
        ''***************************
        'If CCommon.isInStr(checkText, CCommon.CNS_RESET1) Then
        '    Return EnumBarcodeType.RESET_CODE
        'End If

        ''***************************
        ''* 各種コードチェック
        ''***************************
        ''If CCommon.isInStr(checkText, CCommon.CNS_RESET2, CCommon.CNS_RESET3, CCommon.CNS_RESET4) Then
        ''    Return EnumBarcodeType.IRREGULAR_CODE
        ''End If
        'If CCommon.isInStr(checkText, CCommon.CNS_RESET3, CCommon.CNS_RESET4) Then
        '    Return EnumBarcodeType.IRREGULAR_CODE
        'End If

        ''***************************
        ''* 強制終了コードチェック
        ''***************************
        'Select Case checkText
        '    Case CCommon.CNS_END
        '        Return EnumBarcodeType.ME_CLOSED_CODE
        'End Select



        ''***************************
        ''* 出荷指示番号チェック
        ''***************************
        'If checkText.Length = 22 Then
        '    If checkText.Substring(0, 2) = CCommon.CNS_DELIMITER_SHIPORDER1 Then
        '        If checkText.IndexOf(CCommon.CNS_DELIMITER_SHIPORDER2) = 13 Then
        '            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_ROW_CD), "[0-9A-Z]{2}") Then
        '                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_ORDER_CNT), "[0-9A-Z]{1}") Then
        '                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_STRAT_NO), "[0-9A-Z]{2}") Then
        '                        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.SHP_PAGE_NO), "[0-9A-Z]{2}") Then
        '                            Return EnumBarcodeType.SHIPORDER_CODE
        '                        End If
        '                    End If
        '                End If
        '            End If
        '        End If
        '    End If
        'End If

        ''***************************
        ''* 社内納品書チェック
        ''***************************
        'If checkText.Length = 19 Then
        '    If checkText.StartsWith("#**") Then
        '        If checkText.EndsWith("**#") Then
        '            If checkText.IndexOf(CCommon.CNS_DELIMITER_SHIPORDER2) = 14 Then
        '                Return EnumBarcodeType.INNER_DELIVERY
        '            End If
        '        End If
        '    End If
        'End If

        ''***************************
        ''* 注文番号チェック
        ''***************************
        'If checkText.Length > 10 Then
        '    'Dim data As String = barcode.Substring(barcode.Length - 10, 10)
        '    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ORDER_QTY), "[0-9a-zA-Z]{3}") Then ''注文数量 62進数
        '        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ITEM_KEY), "[0-9A-Z]{3}") Then ''品番キー 36進数
        '            'Dim itemDAO As ItemDao
        '            'itemDAO.check(data.Substring(3, 3))
        '            'If itemDAO.getItemCd <> "" Then
        '            If CCommon.isInStr(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_LABEL_TYPE), "I", "N", "M", "E", "D") Then ''ラベルタイプ
        '                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ROW_CD), "[A-Z]{1}") Then ''RowNumのハイフン前 A-Z
        '                    If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.ODR_ROW_NO), "[0-9A-Z]{2}") Then ''RowNumのハイフン後 36進数
        '                        Return EnumBarcodeType.ORDER_CODE
        '                    End If
        '                End If
        '            End If
        '            'End If
        '        End If
        '    End If
        'End If


        ''***************************
        ''* INOACラベルチェック
        ''***************************
        ''NNNNNNNNNNNN*UUUU
        'If checkText.Length > 7 Then
        '    If checkText.IndexOf(CCommon.CNS_DELIMITER_LABEL_INOAC) = checkText.Length - 7 Then
        '        If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_I_UNIQUE_CD), "[0-9A-Z]{4}") Then
        '            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_I_QTY), "[0-9A-Z]{2}") Then
        '                Return EnumBarcodeType.OUTER_LABEL_CODE_I
        '            End If
        '        End If
        '    End If
        'End If

        ''***************************
        ''* ダイキョーラベルチェック
        ''***************************
        ''@XXXXXXXXXNNNMMMD
        'If checkText.Length > 8 Then
        '    If checkText.StartsWith(CCommon.CNS_DELIMITER_LABEL_DNC1) Then
        '        If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_DNC2) Or checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_DNC3) Then
        '            If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_D_ORDER_QTY), "[0-9A-Z]{3}") Then
        '                If Regex.IsMatch(CCommon.TrimCode(checkText, CCommon.EnumGetString.LBL_D_ITEM_KEY), "[0-9A-Z]{3}") Then
        '                    Return EnumBarcodeType.OUTER_LABEL_CODE_D
        '                End If
        '            End If
        '        End If
        '    End If
        'End If

        ''***************************
        ''* マツダラベルチェック
        ''***************************
        ''*KCCCCCNNNNNNNNNNNN00000000Z*
        'If checkText.Length > 2 Then
        '    If checkText.StartsWith(CCommon.CNS_DELIMITER_LABEL_MAZDA1) Then
        '        If checkText.EndsWith(CCommon.CNS_DELIMITER_LABEL_MAZDA2) Then
        '            If CCommon.isInStr(checkText.Substring(1, 1), "A", "B") Then
        '                Return EnumBarcodeType.OUTER_LABEL_CODE_M
        '            End If
        '        End If
        '    End If
        'End If

        ' ''DB参照


        ''***************************
        ''* どれにもヒットしなかった場合
        ''***************************
        Return EnumBarcodeType.NONE


    End Function


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="value"></param>
    ''' <param name="type"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>

    Public Shared Function getBarcodeVl(ByVal value As String, ByVal type As EnumBarcodeType, _
                                            ByVal getStrType As EnumBarcodeType) As String

        Select Case type
            Case EnumBarcodeType.GROUP_REPORT_CODE

                Dim groupCd As String = value.Replace("##", "")
                Return groupCd

            Case EnumBarcodeType.REPORT_CODE
                'Dim reportCd As String = value.Substring(2, 13)
                Dim reportCd As String = value.Substring(2)
                Return reportCd

            Case EnumBarcodeType.INNER_LABEL_CODE
                Select Case getStrType
                    Case EnumBarcodeType.SYSITEM_CD
                        Dim itemInfo As String() = value.Split("@")
                        Return itemInfo(0) 'システム品番

                    Case EnumBarcodeType.UNIQUE_CD
                        'XXXXXXX@DDDD ->入り数外して@も外して渡す
                        Return value.Substring(0, value.Length - 2).Replace("@", "")

                    Case EnumBarcodeType.INBOX_QTY
                        'XXXXXXX@DDDDII -> IIを渡す 
                        Return value.Substring(value.Length - 2)
                End Select
        End Select

        Return ""
    End Function



End Class
